import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.SQLWarning;
import java.sql.Statement;

import com.sun.org.apache.bcel.internal.generic.DMUL;


public class ConnexionDirect {

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		Connection uneConnection = null;


		try {
			Class.forName("com.mysql.jdbc.Driver");
			System.out.println("le driver a été récupéré !");
		} catch (ClassNotFoundException e) {
			System.out.println("le driver n'a pu être récupé !");
			e.printStackTrace();
		}

		String nomBDD = "test2";

		String UrlJdbc = "jdbc:mysql://localhost:3306/" +  nomBDD +  "?user=root&password=";
		System.out.println("l'url jdbc est : " + UrlJdbc);

		try {
			uneConnection = DriverManager.getConnection(UrlJdbc);
			System.out.println("La connection est ouverte ? " + !uneConnection.isClosed());

		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}


		testLecteureSeule(uneConnection);

		affichageWarnings(uneConnection);
		System.out.println("==========================================");
		infoBase(uneConnection);
//		System.out.println("==========================================");
//		testExcute(uneConnection);
//		System.out.println("==========================================");
//		testExcuteBach(uneConnection);
		System.out.println("==========================================");
		testRequeteConcat(uneConnection);
	}

	// test de la connexion ?

	public static void testLecteureSeule(Connection uneConnection )
	{
		boolean etat;
		try {
			etat = uneConnection.isReadOnly();
			uneConnection.setReadOnly(!etat);
			if (uneConnection.isReadOnly()!= etat)
			{
				System.out.println("Le mode lecture seule est pris en charge par ce pilote");
			}
			else {
				System.out.println("le mode lecture seule n\'est pas pris en charge par ce pilote");
			}
			uneConnection.setReadOnly(etat);
		}catch (SQLException e)
		{
			e.printStackTrace();
		}

	}
	//affichage

	public static void affichageWarnings (Connection uneConnection)
	{
		SQLWarning avertissement;
		try
		{
			avertissement=uneConnection.getWarnings();
			if (avertissement==null)
			{
				System.out.println("il n\'y a pas d\'avertissement");

			}else
			{
				while(avertissement!=null)
				{
					System.out.println(avertissement.getMessage());
					System.out.println(avertissement.getSQLState());
					System.out.println(avertissement.getErrorCode());
					System.out.println(avertissement.getNextException());
				}
			}uneConnection.clearWarnings();
		}
		catch(SQLException e)
		{ e.printStackTrace();
		}

	}


	//====Informations base==========

	public static void infoBase(Connection uneConnection )
	{

		ResultSet rs;
		DatabaseMetaData dbmd;

		try { 
			dbmd =uneConnection.getMetaData();
			System.out.println("type de base : " + dbmd.getDatabaseProductName());
			System.out.println("version : " + dbmd.getDatabaseProductVersion());
			System.out.println("nom du pilote : " + dbmd.getDriverName());
			System.out.println("version du pilote : " + dbmd.getDriverVersion());
			System.out.println("nom de l'utilisateur : " + dbmd.getUserName());
			System.out.println("url de connexion : " + dbmd.getURL());

			rs=dbmd.getTables(null, null, "%", null);

			System.out.println("structure de base");


			System.out.println("base\tschema\tnom\table\ttype table");
			while (rs.next())
			{
				for (int i = 1; i<=4; i++)
				{
					System.out.println(rs.getString(i)+"t");

				}
				System.out.println();
			}
			rs.close();

			rs=dbmd.getProcedures(null, null, "%");
			System.out.println("les procedures stockées");
			System.out.println("base\tschema\tnom procedure");
			while (rs.next())
			{
				for (int i = 1; i<=3; i++ )
				{
					System.out.println(rs.getString(i)+"t");
				}
				System.out.println();
			}
			rs.close();


		} catch (SQLException e) {
			e.printStackTrace();
		}


	}

	//==========Test excute

	public static void testExcute (Connection uneConnection)

	{
		Statement stm;
		BufferedReader br;
		String requete;
		ResultSet rs;
		boolean resultat;

		try
		{
			stm=uneConnection.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
			br=new BufferedReader(new InputStreamReader(System.in));

			System.out.println("saisir votre instruction SQL :");

			requete=br.readLine();
			resultat=stm.execute(requete);
			if(resultat)
			{
				System.out.println("votre instruction a généré un jeu d'enregistrement");
				rs=stm.getResultSet();
				rs.last();
				System.out.println("il contient " + rs.getRow() + " enregistrement");
			}

			else {
				System.out.println("votre instruction a modifié des enregistrements dans la base");
				System.out.println(("nombre d'enregistrement modifiés : "+ stm.getUpdateCount()));
			}

		}
		catch (SQLException | IOException e) {
			e.printStackTrace();
		}


	}

	//==========Test excuteBach

	public static void testExcuteBach (Connection uneConnection)

	{
		Statement stm;
		BufferedReader br;
		String requete="";

		int[] resultats;

		try
		{
			stm=uneConnection.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
			br=new BufferedReader(new InputStreamReader(System.in));

			System.out.println("saisir vos instructions SQL puis run pour exécuter le lot :");

			requete=br.readLine();
			while (!requete.equalsIgnoreCase("run"))
			{
				stm.addBatch(requete);
				requete=br.readLine();}
			System.out.println("exuecution du lot d'instructions");

			resultats=stm.executeBatch();
			for (int i=0; i<resultats.length; i++)
			{
				switch (resultats[i]) {
				case Statement.EXECUTE_FAILED:
					System.out.println("l'execution de l'instruction" + i +" a echoué");
					break;
				case Statement.SUCCESS_NO_INFO:
					System.out.println("l'execution de l'instruction" + i +" a reussie");
					System.out.println("le nombre d'enregistrements modifiés est inconnu");
					break;
				default:
					System.out.println("l'execution de l'instruction"+ i +" a reussie");
					System.out.println("elle a modifie" + resultats[i]+ " enregistrement");
					break;

				}

			}
		}
		catch (SQLException e) {
			e.printStackTrace();
		}catch (IOException e) {
			e.printStackTrace();
		}
	}
//==  preparedstatement
	
	public static void testRequeteConcat (Connection uneConnection)
	{
		Statement stm;
		BufferedReader br;
		String requete;
		String code;
		ResultSet rs;
		boolean resultat;
		
		try
		{
			stm= uneConnection.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
			br= new BufferedReader(new InputStreamReader(System.in));
			
			System.out.println("saisir le code du client recherché :");
			
			code=br.readLine();
			requete= "select*from customers where customerID=\'"+ code + " \'";
			resultat= stm.execute(requete);
		}
		catch (SQLException e)
		{
			e.printStackTrace();
			
		}catch (IOException e) {
			
		}
	}


}

